package com.leo.generator;


import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.core.exceptions.MybatisPlusException;
import com.baomidou.mybatisplus.generator.AutoGenerator;
import com.baomidou.mybatisplus.generator.config.DataSourceConfig;
import com.baomidou.mybatisplus.generator.config.GlobalConfig;
import com.baomidou.mybatisplus.generator.config.PackageConfig;
import com.baomidou.mybatisplus.generator.config.StrategyConfig;
import com.baomidou.mybatisplus.generator.config.rules.DateType;
import com.baomidou.mybatisplus.generator.config.rules.NamingStrategy;
import org.apache.commons.lang3.StringUtils;

import java.util.Scanner;

/**
 * @author 030
 * @date 2020/9/2 21:13
 * @description mybatis-plus 自动代码生成器类
 * 执行 main 方法控制台输入模块表名回车自动生成对应项目目录中
 * @className CodeGenerator
 */
public class CodeGenerator {


	/**
	 * <p>
	 * 读取控制台内容
	 * </p>
	 */
	public static String scanner(String tip) {
		Scanner scanner = new Scanner(System.in);
		StringBuilder help = new StringBuilder();
		help.append("请输入" + tip + "：");
		System.out.println(help.toString());
		if (scanner.hasNext()) {
			String ipt = scanner.next();
			if (StringUtils.isNotEmpty(ipt)) {
				return ipt;
			}
		}
		throw new MybatisPlusException("请输入正确的" + tip + "！");
	}

	public static void main(String[] args) {
		// 创建代码生成器对象
		AutoGenerator mpg = new AutoGenerator();

		// 全局配置
		GlobalConfig gc = new GlobalConfig();
		gc.setOutputDir(scanner("请输入你的项目路径"));
		gc.setAuthor("030");
		// 生成之后是否自动打开资源管理器
		gc.setOpen(false);
		// 重新生成时是否自动覆盖文件
		gc.setFileOverride(false);
		// $s 为占位符
		// mp 生成 service 层代码， 默认接口名称第一个字母是有 I
		gc.setServiceName("%sService");
		// 设置主键生成策略
		gc.setIdType(IdType.AUTO);
		// 设置 date 的类型，设置为 只使用 java.util.date 代替
		gc.setDateType(DateType.ONLY_DATE);
		//
		// 开启实体属性 Swagger2 注解
		gc.setSwagger2(true);
		mpg.setGlobalConfig(gc);

		// 数据源配置
		DataSourceConfig dsc = new DataSourceConfig();
		dsc.setUrl("jdbc:mysql://localhost:3306/xinguan?useUnicode=true&characterEncoding=UTF-8&serverTimezone=GMT%2B8");
		// dsc.setSchemaName("public");
		dsc.setDriverName("com.mysql.cj.jdbc.Driver");
		dsc.setUsername("root");
		dsc.setPassword("123456");
		// 使用 mysql 数据库
		dsc.setDbType(DbType.MYSQL);
		mpg.setDataSource(dsc);

		// 包配置
		PackageConfig pc = new PackageConfig();
		pc.setModuleName(scanner("请输入模块名"));
		pc.setParent("com.leo");
		pc.setController("controller");
		pc.setService("service");
		pc.setServiceImpl("service.impl");
		pc.setMapper("mapper");
		pc.setEntity("entity");
		pc.setXml("mapper");
		mpg.setPackageInfo(pc);

		// 策略配置
		StrategyConfig strategy = new StrategyConfig();

		strategy.setInclude(scanner("表名，多个英文逗号分割").split(","));
		// 驼峰命名
		strategy.setNaming(NamingStrategy.underline_to_camel);
		strategy.setColumnNaming(NamingStrategy.underline_to_camel);
		// 使用 lombok
		strategy.setEntityLombokModel(true);
		// 设置 controller 的风格：restController controller
		strategy.setRestControllerStyle(true);

		strategy.setControllerMappingHyphenStyle(true);
		mpg.setStrategy(strategy);
		mpg.execute();
	}

}
